package DBLag;

import ModelLag.Room;
import java.sql.*;
import java.util.ArrayList;

/**
 * Databaseklasse for rooms. Heri foregår kommunikationen med databasen med 
 * hensyn til rooms og opbygning af objekter til videre brug i et højere lag.
 * @author DM75 Gruppe 3
 * @version 2011-12-22
 */
public class DbRoom implements IFDbRoom {
    // Forbindelse til databasen.
    private Connection con;
    
    // Preparedstatement til brug for findmetode.
    private PreparedStatement pStmtSelect;
    
    public DbRoom()
    {
        con = DbConnection1.getInstance().getDBcon();
        pStmtSelect = null;
    }
    
    /**
     * Finder et room i databasen og sørger for at det bliver bygget op til et
     * objekt ved hjælp af buildRoom(). pStmtSelect må ikke lukkes(.close) da man derved ikke 
     * kan bruge det næste gang man vil finde et room.
     * @param roomName Navn på room som ønskes fundet.
     * @return Hvis det findes returnes et Room objekt ellers null.
     */
    public Room findRoom(String roomName)
    {
        if(pStmtSelect == null)
        {
            pStmtSelect = getPreparedStmt();
        }
        Room roomObj = null;
        ResultSet results = null;
        
        try
        {
            pStmtSelect.setString(1, roomName);
            results = pStmtSelect.executeQuery();
            if(results.next())
            {
                roomObj = buildRoom(results);
            }
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage());
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        return roomObj;  
    }
    
    /**
     * Henter alle rooms fra databasen og bygger dem op til objekter ved hjælp 
     * af buildRoom() og derefter tilføjer den hvert objekt til en ArrayList.
     * @return ArrayList med alle rooms som findes i Rooms tabellen i databasen.
     */
    public ArrayList<Room> getAllRooms()
    {
        ArrayList<Room> list = new ArrayList<Room>();
        PreparedStatement pstmt = null;
        
        String allRooms = "SELECT * FROM Room ORDER BY roomName";
        
        //System.out.println(allRooms);
        
        Room roomObj = null;
        ResultSet results = null;
        
        try
        {
            pstmt = con.prepareStatement(allRooms);
            pstmt.setQueryTimeout(5);
            results = pstmt.executeQuery();
            while(results.next())
            {
               roomObj = buildRoom(results);
               list.add(roomObj);
            }
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage()); 
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        return list;
    }
    
    /**
     * Indsætter et room objekt som en række i Room tabellen i databasen.
     * @param roomObj Det objekt som ønskes indsat i Room tabellen i databasen.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */
    public int insertRoom(Room roomObj)
    {
        int rc = -1;
        PreparedStatement pstmt = null;
        String insert = "INSERT INTO Room (roomName, size) "
                      + "VALUES (?,?)";
        
        //System.out.println(insert);
        
        try
        {
            pstmt = con.prepareStatement(insert);
            pstmt.setQueryTimeout(5);
            pstmt.setString(1, roomObj.getRoomName());
            pstmt.setString(2, roomObj.getSize());
            
            rc = pstmt.executeUpdate();
            
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage());            
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        return rc;
    }
    
    /**
     * Sletter rækken i Room tabellen i databasen ved hjælp af room navn.
     * @param roomName Navn på room som skal slettes.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */
    public int deleteRoom(String roomName)
    {
        int rc = -1;
        PreparedStatement pstmt = null;
        String delete = "DELETE FROM Room WHERE roomName = ?";
        
        //System.out.println(delete);
        
        try
        {
            pstmt = con.prepareStatement(delete);
            pstmt.setQueryTimeout(5);
            pstmt.setString(1, roomName);
            rc = pstmt.executeUpdate();
            
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage());
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        return rc;
    }
    
    /**
     * Opdaterer rækken i Room tabellen i databasen i forhold til room objektet.
     * @param roomObj Room objekt som er det som skal opdateres.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */
    public int updateRoom(Room roomObj)
    {
        int rc = -1;
        
        try
        {
            String query = "UPDATE Room "
                         + "SET size = ? "
                         + "WHERE roomName = ? ";
            PreparedStatement pstmt = con.prepareStatement(query);
            pstmt.setQueryTimeout(5);
            
            //System.out.println(query);
            
            pstmt.setString(1, roomObj.getSize());
            pstmt.setString(2, roomObj.getRoomName());
            
            
            rc = pstmt.executeUpdate();
            
            pstmt.close();
        }
        
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage());
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }

        return rc;
    }   
    
     /**
     * Opbygningen af room objekt foregår heri.
     * @param results ResultSet. En form for tabel med resultaterne i fra det
     * preparedstatement som er sendt til databasen.
     * @return Room objekt.
     */
    private Room buildRoom(ResultSet results)
    {
        Room roomObj = new Room();
        
        try
        {
            roomObj.setRoomName(results.getString("roomName"));
            roomObj.setSize(results.getString("size"));
        }
        catch(Exception e)
        {
            System.out.println("Error in building room object");
            System.out.println(e.getMessage());
        }
        
        return roomObj;
    }
    
    /**
     * PreparedStatement som bruges til findmetoden. Dette laves en gang og gemmes
     * derefter i en instans variabel, da dette preparedStatement bruges ofte kan
     * dette betale sig at gemme og derved går det hurigtere end hvis man skal til at
     * lave et nyt hver gang.
     * @return PreparedStatement objekt.
     */
    private PreparedStatement getPreparedStmt()
    {
        try
        {
            String query = "SELECT roomName, size "
                         + "FROM Room "
                         + "WHERE roomName = ? ";
            //System.out.println("Preparestatement " + query);
            pStmtSelect = con.prepareStatement(query);
            pStmtSelect.setQueryTimeout(5);
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage());
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        return pStmtSelect;
    }
}


























